#include "TestBloques.h"

#include "../src/recursoDeAlmacenamiento/FabricaRecursosAlmacenamiento.h"
#include "../src/recursoDeAlmacenamiento/RecursoDeAlmacenamiento.h"
#include "../src/estrategiaAlmacenamiento/EstrategiaAlmacenamientoBloques.h"
#include "../src/FuncionesUtiles.h"
#include "../src/estrategiaRecurso/Archivo.h"
#include "../src/estrategiaAlmacenamiento/Iterador.h"
#include "ObjetoSimple.h"
#include "../src/componentes/Bloque.h"
#include "../src/componentes/RegistroVariable.h"
#include "TipoClaveChar.h"

void imprimirBloque(Bloque& bloque);

TestBloques::TestBloques() {

	this->tamanioBloque = 30;
}

TestBloques::~TestBloques() {

}

void TestBloques::run() {

	obtener();
}


void TestBloques::obtener() {

	int tamanio = 50;

	Bloque bloque1(tamanio);

	Bytes dato1("adato kjnj1");
	Bytes dato2("bdato2");
	Bytes dato3("odato3vxd");
	Bytes dato4("kdato");

	RegistroVariable* registro = new RegistroVariable(dato1);
	bloque1.agregarRegistro(registro);
	registro = new RegistroVariable(dato2);
	bloque1.agregarRegistro(registro);
	registro = new RegistroVariable(dato3);
	bloque1.agregarRegistro(registro);
	registro = new RegistroVariable(dato4);
	bloque1.agregarRegistro(registro);

	Bloque bloque2(tamanio);
	bloque2.hidratarse(bloque1.serializarse());

	TipoClaveChar* extractor = new TipoClaveChar();
	Key claveB = extractor->crearClave(extractor->extraerClave(dato2));
	Key claveK = extractor->crearClave(extractor->extraerClave(dato4));

	assert(bloque2.obtener(claveB.serializarse(), extractor).toString() == dato2.toString(), "Probando obtener de bloque");
	assert(bloque2.obtener(claveK.serializarse(), extractor).toString() == dato4.toString(), "Probando obtener de bloque");

	delete extractor;

	imprimirBloque(bloque2);

}


void imprimirBloque(Bloque& bloque) {

	list<Componente*> registros = bloque.getComponentes();
	list<Componente*>::iterator it = registros.begin();

	while (it != registros.end()) {
		RegistroVariable* registro = (RegistroVariable*)*it;
		cout << registro->getDato().toString() << ", ";
		it++;
	}
}
